//
//  HMStatusViewModel.swift
//  Weibo
//
//  Created by fuyu on 2017/7/26.
//  Copyright © 2017年 itteacher. All rights reserved.
//

import UIKit
//  封装微博cell的业务逻辑数据处理，对应的cell视图
class HMStatusViewModel: NSObject {
    
    //引用模型
    var status: HMStatus? {
        
        didSet {
            
            //会员等级
            handleMbrankImage(mbrank: status?.user?.mbrank ?? 0)
            //认证类型
            handleVerifiedTypeImage(verifiedType: status?.user?.verified_type ?? -1)
            
            if let currentStatus = status {
                //处理转发微博
                handleRetweetContent(status: currentStatus)
            }
            //  处理来源数据
            handleSourceContent(source: status?.source ?? "")
        }
    }
    
    //会员等级图片
    var mbrankImage: UIImage?
    //  认证类型等级图片
    var verifiedTypeImage: UIImage?
    
    var retweetContent: String?
    //来源
    var sourceContent: String?
    //  时间处理, 只读计算属性，每次取值发微博时间都和当前时间进行对比，格式化微博时间
    var timeContent: String? {
        //  1. 第一种方式可以使用DateFormatter,把时间字符串转成时间对象， 注意需要指定locale, 并且设置“en_US”
        //        let dt = DateFormatter()
        //        dt.dateFormat = "EEE MMM dd HH:mm:ss Z yyyy"
        //        dt.locale = Locale(identifier: "en_US")
        //        dt.date(from: "时间字符串")
        //  2. 使用YYModel直接把时间字符串转成时间对象
        
        guard let createAt = status?.created_at else {
            return nil
        }
        let dt = DateFormatter()
        
        //  代码执行到此，时间对象一定有值
        if isThisYear(createAt: createAt) {
            //  是今年
            //  创建日历对象
            let calendar = Calendar.current
            //  是否是今天
            if calendar.isDateInToday(createAt) {
                //  今天
                //  获取时间差对应的秒数, 发微博时间距离当前时间差多少秒
                let timeInterval = abs(createAt.timeIntervalSinceNow)
                //  判断是否是1分钟之前
                if timeInterval < 60 {
                    return "刚刚"
                } else if timeInterval < 3600 {
                    //  判断是否是1小时之前的逻辑
                    let result = timeInterval / 60
                    return "\(Int(result))分钟前"
                } else {
                    //  其它时间
                    let result = timeInterval / 3600
                    return "\(Int(result))小时前"
                }
                
            } else if calendar.isDateInYesterday(createAt) {
                //  昨天
                dt.dateFormat = "昨天 HH:mm"
            } else {
                //  其它
                dt.dateFormat = "MM-dd HH:mm"
            }
        } else {
            //  不是今年
            dt.dateFormat = "yyyy-MM-dd HH:mm"
        }
        return dt.string(from: createAt)
    }
    
    //  根据发微博事件判断是否是今年
    private func isThisYear(createAt: Date) -> Bool {
        let dt = DateFormatter()
        //  年份的格式化
        dt.dateFormat = "yyyy"
        //  获取发微博时间年份
        let createAtYear = dt.string(from: createAt)
        //  获取今年时间年份
        let currentYear = dt.string(from: Date())
        return createAtYear == currentYear
    }

    
    //  处理来源内容
    private func handleSourceContent(source: String) {
        
        //  获取开始截取的范围,  获取介绍截取的范围
        if let startRange = source.range(of: "\">"), let endRange = source.range(of: "</"){
            //  获取开始截取的光标索引, upperBound表示在指定范围里面的最大的光标索引
            let startIndex = startRange.upperBound
            //  获取结束截取的光标索引，lowerBound表示在指定范围里面的最小的光标索引
            let endIndex = endRange.lowerBound
            //  根据范围截取指定的字符串
            let subStr = source.substring(with: startIndex..<endIndex)
            //  来源数据拼接
            sourceContent = "来自: " + subStr
        }
    }
    
    
    //处理转发微博
    private func handleRetweetContent(status: HMStatus) {
        
        if let retweetStatus = status.retweeted_status {
            //  有转发微博内容
            //  获取转发微博用户昵称
            if let screenName = retweetStatus.user?.screen_name,let text  = retweetStatus.text {
                //  昵称和转发微博内容一定有值，进行字符串的拼接
                retweetContent = "@\(screenName): \(text)"
            }
        }
    }
    
    
    //处理认证类型等级图片 (verifiedType 数字对应的图片)
    private func handleVerifiedTypeImage (verifiedType: Int) {
        
        switch verifiedType {
        case 0:
            verifiedTypeImage = UIImage(named: "avatar_vip")
        case 2,3,5:
            verifiedTypeImage = UIImage(named: "avatar_enterprise_vip")
        case 220:
            verifiedTypeImage = UIImage(named: "avatar_grassroot")
        default:
            verifiedTypeImage = nil
        }
    }
    
    //  处理会员等级图片（mbrank 对应的图片）
    private func handleMbrankImage(mbrank: Int) {
        if mbrank >= 1 && mbrank <= 6 {
            mbrankImage = UIImage(named: "common_icon_membership_level\(mbrank)")
        } else {
            mbrankImage = nil
        }
    }

    
    
}
